package aphorism;

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.geom.Rectangle2D;
import javax.swing.JPanel;

/**
 * Klasse zur Anzeige eines Textes in einem JPanel.
 * <br>
 * Besitzt mehrere Attribute die zur Anzeige des Textes benutzt werden, wie zum Beispiel dessen Farbe und Groesse.
 * <br>
 * Das Panel zeichnet sich selbst und sollte zur Anzeige in einem JFrame Layout hinzugefuegt werden.
 * 
 * @author Patrick Bauer
 * @version 1.0
 */
public class StringPanel extends JPanel {
    /**
     * Der auszugebende Text. Mehrzeiliger Text wird mit | getrennt.
     */
    private String text;
    
    /**
     * Die Schriftfarbe des Textes
     */
    private Color fontColor;
    
    /**
     * Die Schriftfamilie des Textes, angegeben als Name des Fonts.
     */
    private String fontFamily;
    
    /**
     * Die Schriftgrösse des Textes
     */
    private int fontSize;
    
    /**
     * Der Schriftstil des Textes. Angebbar als Bitmaske für die Optionen Plain, Bold und Italic.
     * @see Font
     */
    private int fontStyle;
    
    
    /**
     * Zeichnet den angegbenen Text vertikal sowie horizontal Zentriert im Panel.
     * <br>
     * Mehrzeiliger Text wird dabei mit dem | Seperator getrennt.
     * <br>
     * Beispiel: Erste Zeile|Zweite Zeile
     * 
     * @param g Graphikobjekt welches zum Zeichnen benutzt wird 
     */
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        
        //zeichne Text
        int x,y;
        
        String[] split = this.getText().split("\\|");
        g.setFont(new Font(this.getFontFamily(), this.getFontStyle(), this.getFontSize()));
        g.setColor(this.getFontColor());
        FontMetrics metrics = g.getFontMetrics();
        
        y = (int) ((this.getHeight() / 2) - (split.length * metrics.getHeight()) / 2);
        
        for(String part : split){
            Rectangle2D stringBounds = metrics.getStringBounds(part, g);
            x = (int) ((this.getWidth() / 2) - (stringBounds.getWidth() / 2));
            g.drawString(part, x, y);
            y += stringBounds.getHeight() + 10; 
        }
        
        //zeichne verwendeten Font und dessen Hoehe
        g.setFont(new Font("Arial", Font.PLAIN, 14));
        g.setColor(Color.black);
        g.drawString(this.fontFamily + " - " + this.fontSize, 5, this.getHeight()-5);
    }
    
    /**
     * Liefert den aktuellen Text aus
     * 
     * @return der aktuelle Text
     */
    public String getText() {
        return text;
    }

    /**
     * Setzt den auszugebenden Text
     * 
     * @param text der zu setzende Text
     */
    public void setText(String text) {
        this.text = text;
    }

    /**
     * Liefert die aktuelle Schriftfarbe aus.
     * 
     * @return die aktuelle Schriftfarbe
     */
    public Color getFontColor() {
        return fontColor;
    }
    
    /**
     * Setzt die Farbe des Textes
     * 
     * @param fontColor die zu setztende Farbe
     */
    public void setFontColor(Color fontColor) {
        this.fontColor = fontColor;
    }

    /**
     * Setzt die Hintergrundfarbe des Panels
     * 
     * @param backgroundColor die zu setztende Hintergrundfarbe
     */
    public void setBackgroundColor(Color backgroundColor) {
        this.setBackground(backgroundColor);
    }

    /**
     * Liefert die Schriftfamilie des Textes
     * 
     * @return die aktuelle Schriftfamilie
     */
    public String getFontFamily() {
        return fontFamily;
    }

    /**
     * Setzt die Schriftfamilie des Textes
     * 
     * @param fontFamily die zu setzende Schriftfamilie
     */
    public void setFontFamily(String fontFamily) {
        this.fontFamily = fontFamily;
    }

    /**
     * Liefert die aktuelle Schriftgroesse des Textes
     * 
     * @return die aktuelle Schriftgroesse
     */
    public int getFontSize() {
        return fontSize;
    }

    /**
     * Setzt die Schriftgroesse des Textes
     * 
     * @param fontSize die zu setzende Schriftgroesse
     */
    public void setFontSize(int fontSize) {
        this.fontSize = fontSize;
    }

    /**
     * Liefert den aktuellen Schriftstil des Textes
     * 
     * @return der aktuelle Schriftstil
     * @see Font
     */
    public int getFontStyle() {
        return fontStyle;
    }

    /**
     * Setzt den Schriftstil des Textes
     * 
     * @param fontStyle der zu setzende Schriftstil als Bitmaske
     * @see Font
     */
    public void setFontStyle(int fontStyle) {
        this.fontStyle = fontStyle;
    }
    
}
